﻿#pragma once
#include <stdio.h>
#include <locale.h>
#include <stdbool.h>
#include <windows.h>
#include <time.h>
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0)
#define WALL L'□'
#define POS_X 24
#define POS_Y 5
#define BODY L'●'
#define FOOD L'★'

enum DIRECTION
{
	UP=1,
	DOWN,
	LEFT,
	RIGHT
};

enum GAME_STATUS
{
	OK = 1,
	ESC,
	KILL_BY_WALL,
	KILL_BY_SELF
};
//贪吃蛇蛇身节点的定义
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,*pSnakeNode;

//定义一个贪吃蛇
typedef struct snake
{
	pSnakeNode pSnake;//维护整条蛇的指针
	pSnakeNode pFood;//指向食物的指针
	int Score;//当前累计的分数
	int Foodweight;//一个食物的分数
	int SleepTime;//休眠的时间,休眠的时间越短，速度越快。
	enum GAME_STATUS status;//游戏的当前状态
	enum DIRECTION dir;//蛇的当前走向
}Snake,*pSnake;

//游戏的开始前的准备
void GameStart(pSnake ps);
//打印欢迎界面
void WelcomeToGame();
//更新光标坐标
void SetPos(int x, int y);
//绘制地图
void CreateMap();
//初始化蛇
void InitSnake(pSnake ps);
//创建食物
void CreateFood(pSnake ps);
//游戏运行的整个逻辑
void GameRun(pSnake ps);
//打印帮助信息
void PrintHelpInfo();
//休眠
void pause();
//走一步
void SnakeMove(pSnake ps);
//判断蛇头下一步是不是食物
int NextIsFood(pSnake ps, pSnakeNode pNext);
//下一步是食物吃食物
void EatFood(pSnake ps, pSnakeNode pNext);
//下一步不是食物
void NotEatFood(pSnake ps, pSnakeNode pNext);
//检测是否撞墙
void Killbywall(pSnake ps);
//检测是否撞到自己
void Killbyself(pSnake ps);
//游戏结束的释放工作
void GameEnd(pSnake ps);